<?php
/**
 * 数据增删改操作，使用该函数
 *
 * @param $sql string 操作的sql预处理语句：例如：insert into table_name (f1,f2,f3) values(?,?,?)
 * @param types string 预处理语句中参数的类型列表
 * @param $args array 预处理sql语句中实际要包含的参数组成的数组
 * @return 返回整数表示受影响的行数，返回false表示执行失败
 */
function execute ($sql, $types = '', Array $args = [])
{
   $affected = false;
   $conn = connect();
   // 获取预处理语句
   if ($stmt = mysqli_prepare($conn, $sql)) {
       // 绑定预处理参数
       $bindFuncArgs = [];
       $bindFuncArgs[0] = $stmt;
       $bindFuncArgs[1] = $types;
       $refs = [];
       foreach ($args as $key => $value) {
          $refs[$key] = &$args[$key];
       }
       if (!empty($args)) {
       $bindFuncArgs = array_merge( $bindFuncArgs, $refs );
     }
       call_user_func_array('mysqli_stmt_bind_param', $bindFuncArgs);

       // 执行预处理语句
       mysqli_stmt_execute($stmt);
       $affected = mysqli_stmt_affected_rows($stmt);
     
       mysqli_stmt_close($stmt);
    }
    mysqli_close($conn);
    return $affected;
}

/**
 * 执行查询数据的数据库操作
 *
 * @param $sql string select语句
 * @param types string 预处理语句中参数的类型列表
 * @param $args array 预处理sql语句中实际要包含的参数组成的数组
 * @return 返回一个二维数组，表示查询结果的数据集合
 */
function query ($sql, $types = '', Array $args = [])
{
   $data = [];
   $conn = connect();
   // 获取预处理语句
   if ($stmt = mysqli_prepare($conn, $sql)) {
       // 绑定预处理参数
       $bindFuncArgs = [];
       $bindFuncArgs[0] = $stmt;
       $bindFuncArgs[1] = $types;
       $refs = [];
       foreach ($args as $key => $value) {
          $refs[$key] = &$args[$key];
       }
       $bindFuncArgs = array_merge( $bindFuncArgs, $refs );
       call_user_func_array('mysqli_stmt_bind_param', $bindFuncArgs);

       // 执行预处理语句
       mysqli_stmt_execute($stmt);
       $result = mysqli_stmt_get_result($stmt);

       // 解析查询结果
       while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
       	$data[] = $row;
       }
     
       mysqli_stmt_close($stmt);
    }
    mysqli_close($conn);
    return $data;
}

/**
 * 根据db.php配置的数据库链接信息，链接数据库，返回mysqli链接资源变量
 *
 * @return 返回mysqli资源变量
 */
function connect ()
{
    $config = require_once 'config.php';
    $conn = mysqli_connect($config['host'], $config['username'], $config['password']) or die('链接到mysql数据库发生错误');
    mysqli_select_db($conn, $config['database']);
    return $conn;
}





